<?php
class Delivery_Model_PromocionPedida
	extends Delivery_Model_Promocion
{
	
	public $idPedido;
	public $cantidad;
	public $productos;
	
	public $productosIds;
	public $productosCantidades;
	
	protected $_productosPedidos;
	
	public function getId()
	{
		return $this->getKey();	
	}
	
	public function getPrecioTotal()
	{
		return parent::getPrecio() * $this->cantidad;
	}
	
    public function getProductos()
	{
	    $collection = Delivery_Model_Factory::collection('Productos');
	    $items = $this->getItems();
	    
	    foreach ( $items as $item ){
		
			if ($item->isProducto()){
				$collection->append( $item->getProducto() );
			}
			elseif ($item->isProductos()){
				
				$productos = $item->getProductos();
				
				foreach ( $productos as $producto ){
					$collection->append( $producto );
				}
				
			}elseif ($item->isCategoria()){
				
				$productos = $item->getCategoryProductos( $this->idNegocio );
				
			    foreach ( $productos as $producto ){
					$collection->append( $producto );
				}
			}
		}
	    
		return $collection;	
	}
	
    public function getProductosPedidos()
	{
	    $productosPedidos = $this->_productosPedidos;
	    
	    if( empty( $productosPedidos)){
	    
            $productos = $this->getProductos();
	        $productosPedidos = Delivery_Model_Factory::collection('Productos');
	        
	        if( empty($this->productosIds)){
	            return $productosPedidos;
	        }
	        
            foreach ($this->productosIds as $idProducto){
    	   
                $producto = $productos[$idProducto];
    	   
                $productoPedido = new Delivery_Model_ProductoPedido( (array) $producto );
                $productoPedido->setCategoria( $producto->getCategoria());
                $productoPedido->cantidad = $this->productosCantidades[$idProducto];
    	       
                $productosPedidos->append($productoPedido); 
            }
	    }
	    
		return $productosPedidos;	
	}
		
	public function setProductosPedidos( $productos )
	{
		$this->_productosPedidos = $productos;
		return $this;	
	}
	
	public function setCombinaciones( $combinaciones )
	{
	    if( empty($combinaciones)){
	        $combinaciones = array();
		}
	    
		if( !is_array($combinaciones)){
		
			list($productosIds, $productosCan) = explode( ':', $combinaciones);
		
			$combinaciones = array_combine(
				explode( '-', $productosIds),
				explode( '-', $productosCan)
			);
		}
		
		$items = $this->getItems();

		foreach ( $items as $item ){
		
			if ($item->isProducto()){
				
				$this->_add($item->idProducto, $item->cantidad);
				
			}
			elseif ($item->isProductos()){
				
				$productos = $item->getProductos();
				
				$nTot = 0;
				
				foreach ( $productos as $producto ){
					
					$n = $this->_search( $combinaciones, $producto->idProducto);
					
					$nTot+=$n;
					
					if ($n){
						$this->_add($producto->idProducto, $n);
					}
				}
				
				if ( $nTot < $item->cantidad ){
					throw new Delivery_Model_Exception( Delivery_Model_Exception::PROMOTION_MISSING_ITEMS );
				}
				
				
			}elseif ($item->isCategoria()){
				
				$productos = $item->getCategoryProductos( $this->idNegocio );
				
				$nTot = 0;
				
				foreach ( $productos as $producto ){
					
					$n = $this->_search( $combinaciones, $producto->idProducto);
					
					$nTot+=$n;
					
					if ($n){
						$this->_add($producto->idProducto, $n);
					}
				}
				
				if ( $nTot < $item->cantidad ){
					throw new Delivery_Model_Exception( Delivery_Model_Exception::PROMOTION_MISSING_ITEMS );
				}
				
			}
		}
			
			
			
	}
	
	public function getKey()
	{
		
		$p = empty($this->productos) ? null : implode(':', array_keys($this->productos));
		$c = empty($this->productos) ? null : implode(':', $this->productos);
		
		if( $p ){
			$key = "{$this->idPromocion}-{$p}-{$c}";
		} else {
			$key = $this->idPromocion;
		}
		
		return $key;
	}
	
	protected function _search( &$combinaciones, $idProducto)
	{
		return isset($combinaciones[$idProducto]) ? $combinaciones[$idProducto] : 0;
//		
//		$n = 0;
//		foreach ($combinaciones as $id=>$cantidad){
//			if( $p==$idProducto){
//				$n++;
//				unset($productos[$k]);
//			}
//		}
//		
//		return $n;
	}
	
	protected function _add( $idProducto, $cantidad)
	{
		if ( isset( $this->productos[$idProducto]) ){
			$this->productos[$idProducto]+= $cantidad;
		} else {
			$this->productos[$idProducto] = $cantidad;
		}
		
	}
	
}